//
//  STStatusDAL.swift
//  STVVeibo
//
//  Created by leergou on 16/8/2.
//  Copyright © 2016年 WhiteHouse. All rights reserved.
//

import UIKit

// 微博首页处理层
class STStatusDAL: NSObject {
    /*
    01 - 查询数据 -> 返回数据
    - 如果查询本地有数据  直接返回
    - 如果查询本地没有数据
    - 网络请求数据
    - 保存数据
    02 - 保存数据
    
    03 - 删除数据
    */
    //MARK: 检查本地是否有数据 -> 类方法
    class  func checkCache(sinceId: Int64, maxId:Int64, callBack:(response:[[String: AnyObject]]?)->()) {
        
        // 本地查询结果进行判断
        let result = STStatusDAL.getCache(sinceId, maxId: maxId)
        
        if result?.count > 0 {
            print("本地数据")
            callBack(response: result)
        } else {
            print("网络数据")
            // 请求网络数据
            STNetworkTools.shardTools.homeLoadData(sinceId, maxId: maxId, success: { (response) -> () in
                
//                print(response)
                
                // 判断是否为nil
                guard let res = response?["statuses"] as? [[String: AnyObject]] else {
                    callBack(response: nil)
                    return
                }
                // 01 请求数据成功
                callBack(response: res)
                // 02保存数据
                STStatusDAL.saveCache(res)
                
                }, failure: { (error) -> () in
                    // 失败
                    print("请求数据失败:\(error)")
                    callBack(response: nil)
            })
        }
    }
    
    ////MARK: 查询数据
    class func getCache(sinceId: Int64, maxId: Int64) -> [[String: AnyObject]]? {
        
        // 判断用户是否登录
        guard let userId = STUserAccountViewModel.sharedUserAccountTools.userAccount?.uid else {
            print("用户没有登录")
            return nil
        }
        
        // 登录了
        // 如果是第一次,需要从网络获取数据
        if sinceId <= 0 && maxId <= 0 {
            return nil
        }
        
        // 不是第一次登录
        // 准备 sql 语句
        var sql = ""
        sql += "SELECT * FROM T_STStatus\n"
        sql += "WHERE userid=\(userId)\n"
        if sinceId > 0 {
            sql += "AND statusid>\(sinceId)\n"
        }
        if maxId > 0 {
            sql += "AND statusid<=\(maxId)\n"
        }
        sql += "ORDER BY statusid DESC\n"
        sql += "LIMIT 20"
    // 得到查询结果
    let result = STSQLManager.sharedTools.selectRecord(sql)
        // 创建一个可变临时数组
        var tempArray: [[String: AnyObject]] = [[String: AnyObject]]()
        print(tempArray.count)
        // 遍历结果数组
        for dic in result {
            let dict = try! NSJSONSerialization.JSONObjectWithData(dic["status"] as! NSData, options: []) as! [String: AnyObject]
            // 保存字典
            tempArray.append(dict)
        }
        return tempArray
    }
    
    // 保存微博数据
    class func saveCache(response: [[String: AnyObject]]) {
        // 用户 uid
        guard let userId = STUserAccountViewModel.sharedUserAccountTools.userAccount?.uid else {
            print("用户没有登录")
            return
        }
        // 准备 sql 
        let sql = "INSERT OR REPLACE INTO T_STStatus (statusid,userid,status) VALUES (?,?,?)"
        // 执行sql 语句
        //???为什么能用 tools 点出来 queue
        STSQLManager.sharedTools.queue.inTransaction { (db, rollback) -> Void in
            
            // 遍历数组
            for dic in response {
                // 微博 id
                let statusId = dic["id"] as! NSNumber
                // 微博数据
                let status = try! NSJSONSerialization.dataWithJSONObject(dic, options: [])
                
                // 保存数据
                let result = db.executeUpdate(sql, withArgumentsInArray: [statusId,userId,status])
                
                if result {
                    print("保存成功")
                } else {
                    print("保存失败")
                    // 失败要回滚
                    rollback.memory = true
                }
            }
        }
    }
    
    // 删除本地数据
    class func deleteCach() {
        // 日期
        let timeStr = NSDate.deleteCacheTimeStr()
        // 准备 sql
        let sql = "DELETE FROM T_STStatus WHERE createtime<'\(timeStr)'"
        // 执行 sql
        STSQLManager.sharedTools.queue.inDatabase { (db) -> Void in
            let result = db.executeUpdate(sql, withArgumentsInArray: nil)
            
            if result {
                print("删除数据成功")
            } else {
                print("删除数据失败")
            }
        }
    }
}















